package guet.imagan.progbuilder.annotation;

import java.lang.annotation.*;

/**
 * 表示解释器命令，该注解作用在Interpreter的实现类上.
 * 其中，命令行中可以包含如下占位符：
 * （1）{main} 启动解释器执行程序所需要传入的启动字符串，对于java来说，这表示主类类名，对于Python程序，这是主模块文件名
 * （2）{libPath},表示程序要正常启动需要依赖的库目录，对于Java来说，这表示类路径
 */
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Target(ElementType.TYPE)
public @interface InterpreteCommand {

	/**
	 * 默认占位符常量，表示启动解释器执行程序所需要的启动字符串
	 */
	String main="{main}";
	/**
	 * 默认占位符常量，表示执行解释语言程序需要的库路径
	 */
	String libPath="{libPath}";

	/**
	 * 解释器的显示名称
	 *
	 * @return 解释器显示名称
	 */
	String interpreterName() default "interpretor";

	/**
	 * 解释器能够解释执行的文件的扩展名，例如，java语言（.class),python语言，python
	 *
	 * @return
	 */
	String[] FileExtension();

	/**
	 * 解释器解释执行程序的命令行字符串.表示以独立的窗口运行程序，该命令是假设程序没有语法错误。该命令行中各以空格分隔的参数，包含固定字符串，
	 * 也可能包含占位符，占位符的格式如下：
	 * {X},X的可能取值有：
	 * （1） {main}:表示主类、主模块所在的源文件名等。例如，对Java语言来说，它表示主类。对Python来说，它表示主模块文件名
	 * 应用举例：对于java，{"cmd","/k","start","java","{main}","-d","{libPath}"}
	 * 这里{main}是一个约定俗成的占位符，表示主类，编译时将被实际的主类类名填充
	 * 对于python，为{"cmd","/k","start","python","{main}"}
	 * 这里的main表示主模块的源文件,实际执行时，{main}将被实际字符串代替
	 *
	 * @return 带窗口的命令行命令
	 */
	String[] commandWithWindow();

	/**
	 * 解释命令行字符串.表示后台方式（看不到独立的运行窗口）运行解释器，该命令通常用于检查语法错误（对于纯解释型语言），
	 * 运行测试用例。里面包含的可能占位符与commandWithWindow相同
	 * 应用举例：对于java，{"java","{main}"}
	 * 这里{main}是一个约定俗成的占位符，表示主类，编译时将被实际的主类类名填充
	 * 对于python，为｛"python","{main}"}
	 * 这里的main表示主模块的源文件，实际执行时，{main}将被实际字符串代替
	 *
	 * @return
	 */
	String[] commandWithoutWindow();

}
